#ifndef ROBOT_H__
#define ROBOT_H__

#include <bits/stdc++.h>
#include "main.h"
using namespace std;

// 机器人
struct Robot
{
    Point p;    // 机器人当前帧坐标
    int goods;  // 是否携带物品，0表示未携带，1表示携带
    int status; // 0表示恢复状态，1表示正常状态

    int rand_frame;   // 每次碰撞给机器人赋一个随机帧，0~10
    int pre_status;   // 机器人的上一帧状态，初始为1
    int is_move;      // 0表示上一帧未执行move指令，1表示执行了
    int is_get;       // 0表示上一帧未执行get指令，1表示执行了
    int is_pull;      // 0表示上一帧未执行pull指令，1表示执行了
    Point mp;         // 机器人移动前的位置坐标
    int move_target;  // 机器人目标，0表示空闲，1表示前往商品的路上，2表示前往泊位的路上
    Point target;     // 目标商品或目标泊位的坐标
    int goods_take;   // 携带的物品
    int find_gds_failed; // 是否查找物品失败，0为成功，1为失败
    int target_id;    // 目标泊位的id，只有move_target=2的时候有效
    
    int path_index;		// 当前位置下标
    vector<Point> path; // 机器人移动路径
    vector<Point> avoid_path; // 机器人避障路径
    vector<int> avoid_robot; // 要避让的机器人id
    unordered_map<int, Point> conflict_point; // 当前机器人和需要躲避机器人之间的冲突点的映射
    int is_avoiding;	// 是否正在避障
    int avoid_failed;   // 是否找不到避让路径，0为能找到，1为找不到
    int wait_times; 	// 机器人等待次数
    
    int pre_bad_berth;
    int pre_bad_gp;

    vector<int> reach_berth; // 机器人可达的泊位
    int reach_berth_status;  // 是否初始化可达泊位，0为未初始化，1为已初始化，2为不可达任何泊位
    Robot() : pre_status(1) 
    { 
    	path.reserve(400); 
    	pre_bad_berth = -1;
    	pre_bad_gp = -1;
    }
    Robot(int x, int y) : pre_status(1)
    {
        p.x = x;
        p.y = y;
        path.reserve(400);
        pre_bad_berth = -1;
    	pre_bad_gp = -1;
    }
};

extern Robot robot[robot_num]; // 机器人信息
extern int astar_times; // 一帧的a*计算次数
extern int no_task_rbt; // 本帧手上没有任务的机器人数量

// 机器人执行任务
void robot_task(int rbt_id);

#endif
